 /*******************************************************************************
  * Copyright (c) 2005, 2006 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
  * Contributors:
  * IBM Corporation - Initial API and implementation
  *******************************************************************************/
 package org.eclipse.ui.internal.browser;

 import java.io.File ;
 import java.net.MalformedURLException ;
 import java.net.URL ;

 import org.eclipse.core.runtime.IAdaptable;
 import org.eclipse.core.runtime.IPath;
 import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.swt.dnd.DND;
 import org.eclipse.swt.dnd.DropTarget;
 import org.eclipse.swt.dnd.FileTransfer;
 import org.eclipse.swt.dnd.Transfer;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.ui.IActionBars;
 import org.eclipse.ui.ISelectionListener;
 import org.eclipse.ui.IWorkbenchPart;
 import org.eclipse.ui.PartInitException;
 import org.eclipse.ui.PlatformUI;
 import org.eclipse.ui.browser.IWorkbenchBrowserSupport;
 import org.eclipse.ui.part.ISetSelectionTarget;
 import org.eclipse.ui.part.ViewPart;

 /**
  * A Web browser viewer.
  */
 public class WebBrowserView extends ViewPart implements
         IBrowserViewerContainer, ISetSelectionTarget {
     public static final String WEB_BROWSER_VIEW_ID = "org.eclipse.ui.browser.view"; //$NON-NLS-1$

     protected BrowserViewer viewer;

     protected ISelectionListener listener;

     public void createPartControl(Composite parent) {
         int style = WebBrowserUtil.decodeStyle(getViewSite().getSecondaryId());
         viewer = new BrowserViewer(parent, style);
         viewer.setContainer(this);

         /*
          * PropertyChangeListener propertyChangeListener = new
          * PropertyChangeListener() { public void
          * propertyChange(PropertyChangeEvent event) { if
          * (BrowserViewer.PROPERTY_TITLE.equals(event.getPropertyName())) {
          * setPartName((String) event.getNewValue()); } } };
          * viewer.addPropertyChangeListener(propertyChangeListener);
          */
         initDragAndDrop();
     }

     public void dispose() {
         if (viewer!=null)
             viewer.setContainer(null);
         if (listener != null)
             removeSelectionListener();
     }

     public void setURL(String url) {
         if (viewer != null)
             viewer.setURL(url);
     }

     public void setFocus() {
         viewer.setFocus();
     }

     public boolean close() {
         try {
             getSite().getPage().hideView(this);
             return true;
         } catch (Exception e) {
             return false;
         }
     }

     public IActionBars getActionBars() {
         return getViewSite().getActionBars();
     }

     public void openInExternalBrowser(String url) {
         try {
             URL theURL = new URL (url);
             IWorkbenchBrowserSupport support = PlatformUI.getWorkbench()
                     .getBrowserSupport();
             support.getExternalBrowser().openURL(theURL);
         } catch (MalformedURLException e) {
             // TODO handle this
 } catch (PartInitException e) {
             // TODO handle this
 }
     }

     public void addSelectionListener() {
         if (listener != null)
             return;

         listener = new ISelectionListener() {
             public void selectionChanged(IWorkbenchPart part,
                     ISelection selection) {
                 onSelectionChange(selection);
             }
         };
         getSite().getWorkbenchWindow().getSelectionService()
                 .addPostSelectionListener(listener);
     }
     
     private void onSelectionChange(ISelection selection) {
         if (!(selection instanceof IStructuredSelection))
             return;
         IStructuredSelection sel = (IStructuredSelection) selection;
         Object obj = sel.getFirstElement();
         if (obj instanceof IAdaptable) {
             IAdaptable adapt = (IAdaptable) obj;
             URL url = getURLFromAdaptable(adapt);
             if (url!=null)
                 setURL(url.toExternalForm());
         }
     }
     
     private URL getURLFromAdaptable(IAdaptable adapt) {
         // test for path
 IPath path = (IPath) adapt.getAdapter(IPath.class);
         if (path != null) {
             File file = path.toFile();
             if (file.exists() && isWebFile(file.getName()))
                 try {
                     return file.toURL();
                 } catch (MalformedURLException e) {
                     return null;
                 }
         }
         return (URL )adapt.getAdapter(URL .class);
     }

     public void removeSelectionListener() {
         if (listener == null)
             return;
         getSite().getWorkbenchWindow().getSelectionService()
                 .removePostSelectionListener(listener);
         listener = null;
     }

     /**
      * Return true if the filename has a "web" extension.
      *
      * @param name
      * @return
      */
     protected boolean isWebFile(String name) {
         return name.endsWith("html") || name.endsWith("htm") || name.endsWith("gif") || //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
 name.endsWith("jpg"); //$NON-NLS-1$
 }

     /**
      * Adds drag and drop support to the view.
      */
     protected void initDragAndDrop() {
         Transfer[] transfers = new Transfer[] {
         // LocalSelectionTransfer.getInstance(),
 // ResourceTransfer.getInstance(),
 FileTransfer.getInstance() };

         DropTarget dropTarget = new DropTarget(viewer, DND.DROP_COPY
                 | DND.DROP_DEFAULT);
         dropTarget.setTransfer(transfers);
         dropTarget.addDropListener(new WebBrowserViewDropAdapter(viewer));
     }

     public void selectReveal(ISelection selection) {
         onSelectionChange(selection);
     }
 }

